/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.sadhar.sipp.hargaitembiaya;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.sadhar.sia.common.ClassConnection;
import org.sadhar.sipp.posbiaya.PosBiaya;
import org.springframework.jdbc.core.RowMapper;

/**
 *
 * @author bloodrunk
 */
public class HargaItemBiayaDAOImpl implements HargaItemBiayaDAO {

    public HargaItemBiayaDAOImpl() {
        ClassConnection.getTransactionProxyFactoryBean().setTarget(this);
    }

    /**
     * Digunakan untuk mengambil data dari tabel hargaItemBiaya
     * @return
     * @throws Exception
     */
    public List<Map> list() throws Exception {
        return ClassConnection.getJdbc().queryForList("SELECT * FROM ppmk.hargaItemBiaya");
    }

    /**
     * Digunakan untuk mengambil data dari tabel hargaItemBiaya berdasarkan kodeItem
     * @param kode
     * @return
     * @throws Exception
     */
    public HargaItemBiaya select(int kode) throws Exception {
        String sql = "SELECT * FROM ppmk.hargaItemBiaya WHERE kodeItem=?";
        return (HargaItemBiaya) ClassConnection.getJdbc().queryForObject(sql, new Object[]{Integer.valueOf(kode)},
                new RowMapper() {

                    public Object mapRow(ResultSet rs, int rowNum)
                            throws SQLException {
                        return new HargaItemBiaya(
                                rs.getString("tahun"),
                                rs.getInt("kodeItem"),
                                rs.getFloat("harga"));
                    }
                });
    }

    /**
     * Digunakan untuk mengambil data hargaItemBiaya
     * @return
     * @throws Exception
     */
    public List<HargaItemBiaya> getAll() throws Exception {
        String sql = "SELECT * FROM ppmk.hargaItemBiaya,ppmk.itemBiaya,ppmk.posBiaya " +
                " WHERE ppmk.hargaItemBiaya.kodeItem=ppmk.itemBiaya.kodeItem" +
                " AND  ppmk.itemBiaya.kodePosBiaya=ppmk.posBiaya.kodePosBiaya";
        return ClassConnection.getJdbc().queryForList(sql);


    }

    /**
     * Digunakan untuk mengambil data harga item biaya berdasarkan tahun
     * @param tahun
     * @return
     * @throws Exception
     */
    public List<Map> listDetail(String tahun) throws Exception {
        String sql = "SELECT * FROM ppmk.hargaItemBiaya hib,ppmk.itemBiaya ib,ppmk.posBiaya pb where " +
                " hib.kodeItem=ib.kodeItem " +
                " AND  ib.kodePosBiaya=pb.kodePosBiaya " +
                " AND hib.tahun=? order by pb.namaPosBiaya,namaItem ";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{tahun});
        List<Map> subNamaPos = new ArrayList<Map>();
        String currentNamaPosBiaya = "";
        String currentTahun = "";
        for (Map map : result) {
            if (currentNamaPosBiaya.equalsIgnoreCase(map.get("namaPosBiaya").toString()) && currentTahun.equalsIgnoreCase(map.get("tahun").toString())) {
                map.put("namaPosBiaya", "");
                map.put("", currentNamaPosBiaya);
                map.put("tahun", "");
                map.put("", currentTahun);
            } else {
                currentNamaPosBiaya = map.get("namaPosBiaya").toString();
                currentTahun = map.get("tahun").toString();
                map.put("", "");
                map.put("", "");
            }
            subNamaPos.add(map);
        }
        return result;
    }

    /**
     * Digunakan untuk melakukan penyimpanan data pada table hargaItemBiaya
     * @param hargaItemBiaya
     */
    public void insert(HargaItemBiaya hargaItemBiaya) {
        String sql = "INSERT INTO ppmk.hargaItemBiaya(tahun,kodeItem,harga) VALUES(?,?,?)";
        ClassConnection.getJdbc().update(sql, new Object[]{
                    hargaItemBiaya.getTahun(), hargaItemBiaya.getKodeItem(), hargaItemBiaya.getHarga()});
    }

    /**
     * Digunakan untuk melakukan pengambilan data posBiaya dari table posBiaya
     * berdasarkan namaTableItem
     * @param namaPosBiaya
     * @param tahun
     * @return
     */
    public List<PosBiaya> getPosBiaya(String namaPosBiaya, String tahun) {
    /*    String sql = " SELECT distinct pb.kodePosBiaya,pb.namaPosBiaya " +
                " FROM ppmk.itemBiaya ib,ppmk.posBiaya pb where pb.kodePosBiaya=ib.kodePosBiaya" +
                " AND ib.kodeItem not in (select hib.kodeItem from ppmk.hargaItemBiaya hib where hib.tahun=?) " +
                " AND pb.namaPosBiaya LIKE ?";
     */
        String sql = "select kodePosBiaya, namaPosBiaya from ppmk.posBiaya where namaTabelItem ='itemBiaya' ";
        //List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{tahun, "%" + namaPosBiaya + "%"});
        List<Map> result = ClassConnection.getJdbc().queryForList(sql);
        List<PosBiaya> list = new ArrayList<PosBiaya>();
        for (Map m : result) {
            PosBiaya posBiaya = new PosBiaya();
            posBiaya.setKodePosBiaya(Integer.valueOf(m.get("kodePosBiaya").toString()));
            posBiaya.setNamaPosBiaya((String) m.get("namaPosBiaya"));
            list.add(posBiaya);
        }
        return list;
    }

    /**
     * Digunakan untuk menampikan data hargaItemBiaya berdasarkan tahun dan kodePosBiaya
     * @param kodePosBiaya
     * @param tahun
     * @return
     * @throws Exception
     */
    public List<Map> listByPosBiaya(int kodePosBiaya, String tahun) throws Exception {
       /* String sql = "SELECT ib.kodeItem,ib.namaItem,hib.harga" +
                " FROM ppmk.itemBiaya ib left join ppmk.hargaItemBiaya hib on ib.kodeItem=hib.kodeItem inner join ppmk.posBiaya pb on pb.kodePosBiaya=ib.kodePosBiaya " +
                " WHERE pb.kodePosBiaya=? and tahun=?";
       */

        String sql = " select kodeItem, namaItem, harga from " +
                     "(SELECT ib.kodeItem,ib.namaItem,hib.harga FROM " +
                     " ppmk.itemBiaya ib left join ppmk.hargaItemBiaya hib on ib.kodeItem=hib.kodeItem inner join ppmk.posBiaya pb on pb.kodePosBiaya=ib.kodePosBiaya " +
                     " WHERE pb.kodePosBiaya=? and tahun=? " +
                     " union all " +
                     " select kodeItem, namaItem, 0 from " +
                     " ppmk.itemBiaya as item inner join ppmk.posBiaya as pos on item.kodePosBiaya=pos.kodePosBiaya " +
                     " where item.kodePosBiaya=?) as sub group by kodeItem order by namaItem " ;
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{kodePosBiaya, tahun, kodePosBiaya});
        return result;
    }

    /**
     * Digunakan untuk menampilkan data dari tabel hargaItemBiaya berdasarkan
     * namaPosBiaya
     * @param namaPosBiaya
     * @return
     * @throws Exception
     */
    public List<Map> listByPosBiaya(String namaPosBiaya) throws Exception {
         String sql = "SELECT ib.kodeItem,ib.namaItem,hib.harga" +
                " FROM ppmk.itemBiaya ib,ppmk.hargaItemBiaya hib,ppmk.posBiaya pb " +
                " WHERE ib.kodeItem=hib.kodeItem AND pb.kodePosBiaya=ib.kodePosBiaya and pb.namaPosBiaya=?";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{namaPosBiaya});
        return result;
    }

    /**
     * Digunakan untuk melakukan perubahan data pada tabel hargaItemBiaya
     * @param hargaItemBiaya
     */
    public void update(HargaItemBiaya hargaItemBiaya) {
        String sql = "UPDATE ppmk.hargaItemBiaya SET harga=? WHERE kodeItem=? AND tahun=?";
        ClassConnection.getJdbc().update(sql,
                new Object[]{hargaItemBiaya.getHarga(), hargaItemBiaya.getKodeItem(), hargaItemBiaya.getTahun()});
    }

    /**
     * Digunakan untuk melakukan pencariaan harga berdasarkan
     * kodeItem dan tahun
     * @param hargaItemBiaya
     * @return
     * @throws Exception
     */
    public List cariHarga(HargaItemBiaya hargaItemBiaya) throws Exception {
        String sql = "SELECT * FROM ppmk.hargaItemBiaya WHERE kodeItem=? AND tahun=?";
        return ClassConnection.getJdbc().queryForList(sql, new Object[]{hargaItemBiaya.getKodeItem(), hargaItemBiaya.getTahun()});
    }
}
